package org.ciallo.simplemusicplayer.data.dao;

import androidx.lifecycle.LiveData;
import androidx.room.*;
import org.ciallo.simplemusicplayer.data.model.PlayCount;
import org.ciallo.simplemusicplayer.data.model.Song;

import java.util.List;

/**
 * @author Jukomu
 * @Description: PlayCount 的数据访问对象 (DAO)
 * @Package: org.ciallo.simplemusicplayer.data.dao
 * @Project: SimpleMusicPlayer
 * @name: PlayCountDao
 * @Date: 2025/6/13-07:47
 * @Filename: PlayCountDao
 */
@Dao
public interface PlayCountDao {

    /**
     * 插入一个新的播放计数记录。如果已存在，则忽略。
     * @param playCount 要插入的 PlayCount 实体对象。
     */
    @Insert(onConflict = OnConflictStrategy.IGNORE) // <--- 修改：参数为实体对象
    void insertNewPlayCount(PlayCount playCount);

    /**
     * 增加已存在记录的播放次数。
     * @param songId 要增加计数的歌曲ID。
     */
    @Query("UPDATE play_counts SET play_count = play_count + 1 WHERE song_id = :songId")
    int incrementExistingPlayCount(long songId); // 返回影响的行数，可以用来判断是否存在

    /**
     * 替代 incrementPlayCount 的更健壮的事务方法。
     * 如果记录不存在，则插入一个 play_count 为 1 的新记录；
     * 如果已存在，则将其 play_count 加 1。
     * @param songId 要增加计数的歌曲ID。
     */
    @Transaction
    default void insertOrIncrement(long songId) {
        // 先尝试增加计数
        int rowsAffected = incrementExistingPlayCount(songId);
        // 如果没有行被影响 (rowsAffected == 0)，说明记录不存在，则插入新记录
        if (rowsAffected == 0) {
            insertNewPlayCount(new PlayCount(songId, 1));
        }
    }



    /**
     * DTO (Data Transfer Object) 用于从JOIN查询接收歌曲及其播放次数。
     */
    class SongWithPlayCount {
        @Embedded
        public Song song; // 包含所有Song的字段

        @ColumnInfo(name = "play_count")
        public int playCount; // 播放次数
    }

    /**
     * 获取所有被播放过的歌曲及其播放次数，按播放次数降序排列。
     * 使用 INNER JOIN 只返回在 play_counts 表中有记录的歌曲。
     * @return LiveData 包装的 SongWithPlayCount 列表。
     */
    @Transaction
    @Query("SELECT s.*, pc.play_count FROM songs s " +
            "INNER JOIN play_counts pc ON s.id = pc.song_id " +
            "ORDER BY pc.play_count DESC, s.title_pinyin ASC")
    LiveData<List<SongWithPlayCount>> getSongsWithPlayCounts();

    /**
     * 清空所有播放统计记录。
     */
    @Query("DELETE FROM play_counts")
    void clearAll();
}
